// 各模块调用js,有一部分涉及ajax调用数据，涉及到是否登录的问题，所以js分为公共部分和单独部分
/**
 * 上传图片
 */
ZHT.upload = function(opts){	
  var _opts = {};
  _opts = $.extend(_opts,{duplicate:true,auto: true,compress:false,swf: ZHT.conf.STATIC +'/plugins/webuploader/Uploader.swf',server:ZHT.U('shop/base/uploadPic')},opts);
  var uploader = WebUploader.create(_opts);
  uploader.on('uploadSuccess', function( file,response ) {
		// console.log(response);
		var json = ZHT.toJson(response._raw);
		// var json = response;
		if(_opts.callback)_opts.callback(json,file);
  });
  uploader.on('uploadError', function( file ) {
    if(_opts.uploadError)_opts.uploadError();
  });
  uploader.on('uploadProgress', function( file, percentage ) {
    percentage = percentage.toFixed(2)*100;
    if(_opts.progress)_opts.progress(percentage);
  });
    return uploader;
}
/**
 * 循环调用及设置商品分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'goodsCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
ZHT.setGoodsCat = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastgoodscat',1); // 下拉框指定lastgoodscat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('shop/goodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setGoodsCat(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastgoodscat'); // 移除上级下拉框的lastgoodscat属性
					tidObj.attr('lastgoodscat',1); // 给该下拉框添加lastgoodscat属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setGoodsCat(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getGoodsCat(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建商品分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="bcat_0" class='ipt goodsCats' level="0" onchange="ZHT.ITGoodsCats({id:'bcat_0',val:this.value,isRequire:false,className:'goodsCat'});" data-rule='所属商品分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getGoodsCat = function(opts){
	opts.className = opts.className ? opts.className : "goodsCat";
	var obj = $('#' + opts.id);
	obj.attr('lastgoodscat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastgoodscat'); // 移除属性lastgoodscat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为goodsCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('shop/goodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastgoodscat属性，然后调用ZHT.getGoodsCat函数的时候，再给本下拉框加上lastgoodscat属性
				if(opts.val != ''){
					obj.removeAttr('lastgoodscat');
				}
				ZHT.getGoodsCat(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后分类值
 */
ZHT.getGoodsCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastgoodscat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getGoodsCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastgoodscat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}
/**
 * 循环调用及设置地区
 * @param id           当前地区ID
 * @param val          当前地区值
 * @param childIds     地区路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'area_0',val:areaIdPath[0],childIds:areaIdPath,className:'Area'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级地区了
 */
 ZHT.setArea = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastarea',1); // 下拉框指定lastarea属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的areaId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('shop/Area/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级地区了,不会再次执行ZHT.setArea(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.areaId + "' "+ ((opts.childIds[0] == cat.areaId) ? "selected" : "") + ">" + cat.areaName + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastarea'); // 移除上级下拉框的lastarea属性
					tidObj.attr('lastarea',1); // 给该下拉框添加lastarea属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setArea(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getArea(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建地区
 * @param id            当前地区ID
 * @param val           当前地区值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="area_0" class='ipt Areas' level="0" onchange="ZHT.ITAreas({id:'area_0',val:this.value,isRequire:false,className:'Area'});" data-rule='所属地区:required;' data-target="#msg_area_0">
 */
ZHT.getArea = function(opts){
	opts.className = opts.className ? opts.className : "Area";
	var obj = $('#' + opts.id);
	obj.attr('lastarea',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的area_0_，都移除，这样是改变上级地区的时候，之前的下级地区要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastarea'); // 移除属性lastarea，该下拉框就不是最后一级地区了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为Area的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastarea',1); // 如果下级下拉选择为空了，则属性lastarea顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('shop/Area/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.areaId + "'>" + cat.areaName + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastarea属性，然后调用ZHT.getArea函数的时候，再给本下拉框加上lastarea属性
				if(opts.val != ''){
					obj.removeAttr('lastarea');
				}
				ZHT.getArea(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后地区值
 */
ZHT.getAreaId = function(className){
	var areaId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastarea')=='1')areaId = $(this).val();
	});
	return areaId;
}
/**
 * 获取最后地区的IdPath
 */
ZHT.getAreaIdPath = function(srcObj,className){
	var areaIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastarea')=='1')areaIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	areaIdPath = areaIdPath.replace(srcObj+'_','');
	return areaIdPath;
}
// 后台菜单权限
$(function(){
	if(ZHT.conf && ZHT.conf.GRANT)ZHT.getGrants(ZHT.conf.GRANT);
})
ZHT.getGrants = function(grant){
	ZHT['GRANT'] = {};
	if(!grant)return;
	var str = grant.split(',');
	for(var i=0;i<str.length;i++){
		ZHT['GRANT'][str[i]] = true;
	}
}
// 生成验证码
ZHT.getVerify = function(img){
  $(img).attr('src',ZHT.U('shop/index/getVerify'));
  $("#verifyCode").val("");
}
/**
 * 店铺商品分类==================================================================================================
 */
/**
 * 循环调用及设置商品分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'ShopGoodsCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
 ZHT.setShopGoodsCat = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastshopgoodscat',1); // 下拉框指定lastshopgoodscat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('shop/ShopGoodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setShopGoodsCat(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastshopgoodscat'); // 移除上级下拉框的lastshopgoodscat属性
					tidObj.attr('lastshopgoodscat',1); // 给该下拉框添加lastshopgoodscat属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setShopGoodsCat(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getShopGoodsCat(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建商品分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="bcat_0" class='ipt ShopGoodsCats' level="0" onchange="ZHT.ITShopGoodsCats({id:'bcat_0',val:this.value,isRequire:false,className:'ShopGoodsCat'});" data-rule='所属商品分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getShopGoodsCat = function(opts){
	opts.className = opts.className ? opts.className : "ShopGoodsCat";
	var obj = $('#' + opts.id);
	obj.attr('lastshopgoodscat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastshopgoodscat'); // 移除属性lastshopgoodscat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为ShopGoodsCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('shop/ShopGoodsCat/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastshopgoodscat属性，然后调用ZHT.getShopGoodsCat函数的时候，再给本下拉框加上lastshopgoodscat属性
				if(opts.val != ''){
					obj.removeAttr('lastshopgoodscat');
				}
				ZHT.getShopGoodsCat(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后分类值
 */
ZHT.getShopGoodsCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastshopgoodscat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getShopGoodsCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastshopgoodscat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}
/**
 * 循环调用及设置设备租赁分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'rentCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
 ZHT.setRentCat = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastrentcat',1); // 下拉框指定lastrentcat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('shop/rentCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setRentCat(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastrentcat'); // 移除上级下拉框的lastrentcat属性
					tidObj.attr('lastrentcat',1); // 给该下拉框添加lastrentcat属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setRentCat(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getRentCat(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建设备租赁分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="bcat_0" class='ipt rentCats' level="0" onchange="ZHT.ITRentCats({id:'bcat_0',val:this.value,isRequire:false,className:'rentCat'});" data-rule='所属设备租赁分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getRentCat = function(opts){
	opts.className = opts.className ? opts.className : "rentCat";
	var obj = $('#' + opts.id);
	obj.attr('lastrentcat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastrentcat'); // 移除属性lastrentcat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为rentCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('shop/rentCat/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastrentcat属性，然后调用ZHT.getRentCat函数的时候，再给本下拉框加上lastrentcat属性
				if(opts.val != ''){
					obj.removeAttr('lastrentcat');
				}
				ZHT.getRentCat(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后分类值
 */
ZHT.getRentCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastrentcat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getRentCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastrentcat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}
/**
 * 循环调用及设置设备租赁分类
 * @param id           当前分类ID
 * @param val          当前分类值
 * @param childIds     分类路径值【数组】
 * @param isRequire    是否要求必填
 * @param className    样式，方便将来获取值
 * @param beforeFunc   运行前回调函数
 * @param afterFunc    运行后回调函数
 * var opts = {id:'bcat_0',val:catIdPath[0],childIds:catIdPath,className:'serviceCat'}
 * childIds值是[1,3,4,5,'']和[1,3,4,5]的区别？没有区别，因为当{parentId:opts.val}是5的时候，已经没有下级分类了
 */
 ZHT.setServiceCat = function(opts){
	var obj = $('#' + opts.id); // 根据传来的id获取下拉框
	obj.attr('lastservicecat',1); // 下拉框指定lastservicecat属性
	var level = obj.attr('level') ? (parseInt(obj.attr('level'),10) + 1) : 1;
	if(opts.childIds.length > 0){		
		opts.childIds.shift(); // 传来的catId数组，删除数组的第一个元素
		if(opts.beforeFunc){
			if(typeof(opts.beforeFunc)=='function'){
				opts.beforeFunc({id:opts.id,val:opts.val});
			}else{
			   var fn = window[opts.beforeFunc];
			   fn({id:opts.id,val:opts.val});
			}
		}
		$.post(ZHT.U('shop/serviceCat/listQuery'),{parentId:opts.val},function(data,textStatus){
			var json = ZHT.toJson(data);
			// {parentId:opts.val}是5的时候，已经没有下级分类了,不会再次执行ZHT.setServiceCat(opts);了
			if(json.data && json.data.length > 0){
				json = json.data;
				var html = [];
				var tid = opts.id + "_" + opts.val;
				html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
				html.push("<option value='' >请选择</option>");
				for (var i = 0; i < json.length; i++) {
					var cat = json[i];
					html.push("<option value='" + cat.catId + "' "+ ((opts.childIds[0] == cat.catId) ? "selected" : "") + ">" + cat.catTitle + "</option>"); // 这里的opts.childIds[0]，应该是上面opts.childIds.shift()删除第一项之后，新的第一项了
				}
				html.push("</select>");
				$(html.join('')).insertAfter(obj);
				var tidObj = $('#' + tid); // 获取上面通过ajax调取数据生成的新的下拉框
				// 如果下拉框选中值不为空，则要考虑是否还有下级下拉框
				if(tidObj.val() != ''){
					obj.removeAttr('lastservicecat'); // 移除上级下拉框的lastservicecat属性
					tidObj.attr('lastservicecat',1); // 给该下拉框添加lastservicecat属性
					opts.id = tid;
					opts.val = tidObj.val();
					ZHT.setServiceCat(opts);
				}
				// 给该新生成的下拉框添加change事件，改变选项，生成新的下级下拉框
				tidObj.change(function(){
					opts.id = tid;
					opts.val = $(this).val();
					ZHT.getServiceCat(opts);
			 	})
			}else{
				opts.isLast = true;
				opts.lastVal = opts.val;
			}
			if(opts.afterFunc){
				if(typeof(opts.afterFunc)=='function'){
					opts.afterFunc(opts);
				}else{
					var fn = window[opts.afterFunc];
					fn(opts);
				}
			}
		})
	}
}
/**
 * 循环创建设备租赁分类
 * @param id            当前分类ID
 * @param val           当前分类值
 * @param className     样式，方便将来获取值
 * @param isRequire     是否要求必填
 * @param beforeFunc    运行前回调函数
 * @param afterFunc     运行后回调函数
 * <select id="bcat_0" class='ipt serviceCats' level="0" onchange="ZHT.ITServiceCats({id:'bcat_0',val:this.value,isRequire:false,className:'serviceCat'});" data-rule='所属设备租赁分类:required;' data-target="#msg_bcat_0">
 */
ZHT.getServiceCat = function(opts){
	opts.className = opts.className ? opts.className : "serviceCat";
	var obj = $('#' + opts.id);
	obj.attr('lastservicecat',1);
	var level = parseInt(obj.attr('level'),10) + 1; // 最开始obj的level为0，+1后得到level=1
	$("select[id^='"+opts.id+"_']").remove(); // 凡是id这样开头的bcat_0_，都移除，这样是改变上级分类的时候，之前的下级分类要移除
	if(opts.beforeFunc){
		if(typeof(opts.beforeFunc)=='function'){
			opts.beforeFunc({id:opts.id,val:opts.val});
		}else{
		  var fn = window[opts.beforeFunc];
		  fn({id:opts.id,val:opts.val});
		}
	}
	opts.lastVal = opts.val;
	if(opts.val == ''){ // 如果选择该下拉框的值为空，就是不选了		
		obj.removeAttr('lastservicecat'); // 移除属性lastservicecat，该下拉框就不是最后一级分类了
		var lastId = 0,level = 0,tmpLevel = 0,lastObjId;
		// 循环所有className为serviceCat的下拉框
		$('.' + opts.className).each(function(){
			tmpLevel = parseInt($(this).attr('level'),10); // 临时存储循环下拉菜单级别level，tmpLevel第一级为0，第二级为1，第三级为2
			// console.log(level + '来啦1');
			// console.log(tmpLevel + '来啦2');
			if(level <= tmpLevel && $(this).val() != ''){ // 如果是一级下拉level=0,tmpLevel=0,第一个条件满足，第二个条件不满足
			// 这个if语句，对一级下拉不管用，如果是二级下拉选择为空了，则一级下拉满足该if语句的条件，则level,lastId,lastObjId都顺应变成一级下拉的值了
				level = tmpLevel;
				lastId = $(this).val();
				lastObjId = $(this).attr('id');
				// console.log('来啦3');
				// return;
			}
		})
		$('#' + lastObjId).attr('lastgoodcat',1); // 如果下级下拉选择为空了，则属性lastgoodcat顺应的移到上级下拉。不管原来是在下面第几级
		// 下面是为ajax准备参数值
		opts.id = lastObjId; // 下拉框id
		opts.val = $('#' + lastObjId).val(); // 下拉框选中的值
		opts.isLast = true; // 不知道什么用
		opts.lastVal = opts.val; // 不知道什么用
		if (opts.afterFunc) {
			if (typeof (opts.afterFunc) == 'function') {
				opts.afterFunc(opts);
			} else {
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
		return;
	}
	// console.log(opts);
	$.post(ZHT.U('shop/serviceCat/listQuery'),{parentId:opts.val},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			var tid = opts.id + "_" + opts.val; // 上级下拉框的id和选中值组合作为下级下拉框的id
			html.push("<select id='" + tid + "' level='" + level + "' class='" + opts.className + "'>");
			html.push("<option value='' >请选择</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
				html.push("<option value='" + cat.catId + "'>" + cat.catTitle + "</option>");
			}
			html.push("</select>");
			$(html.join('')).insertAfter(obj);
			// 给新生成的下拉框增加change事件，下拉框改变时，继续生成下级下拉框
			$('#' + tid).change(function(){
				opts.id = tid;
				opts.val = $(this).val();
				// 如果下级下拉框改变，则移除上级下拉框的lastservicecat属性，然后调用ZHT.getServiceCat函数的时候，再给本下拉框加上lastservicecat属性
				if(opts.val != ''){
					obj.removeAttr('lastservicecat');
				}
				ZHT.getServiceCat(opts);
			})
		}else{
			opts.isLast = true;
	    opts.lastVal = opts.val;
		}
		if(opts.afterFunc){
			if(typeof(opts.afterFunc)=='function'){
				opts.afterFunc(opts);
			}else{
				var fn = window[opts.afterFunc];
				fn(opts);
			}
		}
	})
}
/**
 * 获取最后分类值
 */
ZHT.getServiceCatId = function(className){
	var catId = '';
	$('.'+className).each(function(){
		if($(this).attr('lastservicecat')=='1')catId = $(this).val();
	});
	return catId;
}
/**
 * 获取最后分类的IdPath
 */
ZHT.getServiceCatIdPath = function(srcObj,className){
	var catIdPath = '';
	$('.'+className).each(function(){
		if($(this).attr('lastservicecat')=='1')catIdPath = $(this).attr('id')+'_'+$(this).val()+'_';
	});
	catIdPath = catIdPath.replace(srcObj+'_','');
	return catIdPath;
}
/**
 * 根据产品类型调取产品分类
 */
ZHT.getCatList = function(catType,catId){
	// console.log(catType);
	$.post(ZHT.U('shop/goodsCat/listQuery'),{catType:catType},function(data,textStatus){
		var json = ZHT.toJson(data);
		// console.log(json);
		if(json.data && json.data.length > 0){
			json = json.data;
			var html = [];
			html.push("<option value='' >请选择分类</option>");
			for (var i = 0; i < json.length; i++) {
				var cat = json[i];
        var s = '';
        if(cat.catId == catId){
          s = 'selected';
        }
				html.push("<option value='" + cat.catId + "' " + s + ">" + cat.catTitle + "</option>");
			}
			$("#bcat_0").html(html.join(''));
		}
	})
}